﻿using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using UnityEngine;

public class SaveXml : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #region 知识点一 决定存储在哪个文件夹下
        //注意：存储XML文件 在Unity中一定是使用各平台都可读可写可找到的路径 
        //1.Resources 可读 不可写 打包后找不到 ×
        //2.Application.steamingAssetsPath 可读 PC端可写 找得到，但是在Android和IOS找不到×
        //3.Application.dataPath 打包后找不到 ×
        //4.Application.persistentDataPath 可读可写找得到 √
        string path = string.Format("{0}/{1}", Application.persistentDataPath, "PlayerInfo.xml");
        Debug.LogFormat("persistentDataPath:{0}", path);
        #endregion

        #region 知识点二 存储XML文件
        //关键类 XmlDoucment 用于创建节点 存储文件
        //关键类 XmlDeclaration 用于添加版本信息
        //关键类 XmlElement 节点类

        //存储有5步
        //1.创建文本对象
        XmlDocument xml = new XmlDocument();

        //2.添加固定版本信息
        //这一名代码相当于 创建<?xml version="1.0" encoding="UTF-8"?>
        XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
        xml.AppendChild(xmlDec);

        //3.添加根节点
        XmlElement root = xml.CreateElement("Root");
        xml.AppendChild(root);


        //4.为根节点添加子节点
        XmlElement name = xml.CreateElement("name");
        name.InnerText = "kitty";
        root.AppendChild(name);

        XmlElement atk = xml.CreateElement("atk");
        atk.InnerText = "10";
        root.AppendChild(atk);

        XmlElement listInt = xml.CreateElement("listInt");
        for (int i = 1; i <= 3; i++)
        {
            XmlElement childNode = xml.CreateElement("int");
            childNode.InnerText = i.ToString();
            listInt.AppendChild(childNode);
        }
        root.AppendChild(listInt);

        XmlElement itemList = xml.CreateElement("itemList");
        for (int i = 1; i <= 3; i++)
        {
            XmlElement childNode = xml.CreateElement("Item");
            childNode.SetAttribute("id", i.ToString());
            childNode.SetAttribute("num", (i * 10).ToString());
            itemList.AppendChild(childNode);
        }
        root.AppendChild(itemList);

        //5.保存
        xml.Save(path);
        #endregion

        #region 知识三 修改Xml文件
        //1.判断文件是否存在
        if (File.Exists(path))
        {
            //2.加载后 直接添加节点 移除节点即可
            XmlDocument newXml = new XmlDocument();
            newXml.Load(path);

            //父节点
            XmlNode rootNode = newXml.SelectSingleNode("Root");

            //移除节点
            //XmlNode aktNode1 = newXml.SelectSingleNode("Root").SelectSingleNode("atk");
            //这种是简写，通过/来区分父子关系
            XmlNode atkNode2 = newXml.SelectSingleNode("Root/atk");
            //移除子节点
            rootNode.RemoveChild(atkNode2);

            //添加节点
            XmlElement speed = newXml.CreateElement("moveSpeed");
            speed.InnerText = "20";
            rootNode.AppendChild(speed);

            newXml.Save(path);
        }
        #endregion

        #region 总结
        //1.路径选取
        //在运行过程中存储 只能往可写且能找到的文件夹存储
        //所以只能 选择 Application.persistentDataPath

        //2.存储Xml关键类
        //XmlDoucment 文件
        // 创建节点 CreateElement
        // 创建固定内容方法 CreateXmlDeclaration
        // 添加节点 AppendChild
        // 保存 Save
        //XmlDeclaration 版本
        //XmlElement 元素节点
        //设置属性方法 SetAttribute

        //3.修改
        //RemoveChild 移除节点
        //可以通过 / 形式来表示 子节点的子节点
        #endregion

        #region 练习题
        PlayerInfo playerInfo = new PlayerInfo();
        playerInfo.name = "kitty";
        playerInfo.atk = 200;
        playerInfo.def = 30;
        playerInfo.moveSpeed = 100;
        playerInfo.roundSpeed = 200;
        playerInfo.weapon = new Item() { id = 100, num = 100 };
        playerInfo.listInt = new List<int>(){ 100,200,300};
        playerInfo.itemList = new List<Item>() { new Item() { id = 10, num = 20 }, new Item() { id = 20, num = 30 } , new Item() { id = 30, num = 40 } };
        playerInfo.itemDic = new Dictionary<int, Item>() { { 1000,new Item() { id=1000,num=1} }, { 1001, new Item() { id = 2000, num = 100 } } };
        playerInfo.SaveData("PlayerInfo.xml");
        #endregion
    }
}
